package com.example.tenant.init;

import com.example.tenant.config.DataSourceContextHolder;
import com.example.tenant.config.DynamicDataSource;
import com.example.tenant.dto.TenantDatasourceDTO;
import com.example.tenant.entity.Datasource;
import com.example.tenant.mapper.DatasourceMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

/**
 * 系统初始化runner
 *
 * @version v1.0
 * @date 2017年7月24日
 * @see @Order注解的执行优先级是按value值从小到大顺序。
 */
@Component
@Order(value = 1)
@Slf4j
public class SystemInitRunner implements ApplicationRunner {

    @Resource
    private DatasourceMapper tenantDatasourceMapper;

    @Autowired
    private DynamicDataSource dynamicDataSource;

    @Override
    public void run(ApplicationArguments args) {
        //租户端不进行服务调用
        log.info("==服务启动后，初始化数据源==");
        //切换默认数据源 即tenant库的数据源，用于查询tenant表中的所有tenant数据库配置
        DataSourceContextHolder.setDBType("default");
        //设置所有数据源信息
        log.info("获取当前数据源：" + DataSourceContextHolder.getDBType());
        List<Datasource> tenantInfoList = tenantDatasourceMapper.selectList(null);
        for (Datasource info : tenantInfoList) {
            TenantDatasourceDTO tenantDatasourceDTO = new TenantDatasourceDTO();
            BeanUtils.copyProperties(info, tenantDatasourceDTO);
            dynamicDataSource.addDataSource(tenantDatasourceDTO);
        }

        log.info("动态数据源对象中的所有数据源, 已加载数据源个数: {}", dynamicDataSource.backupTargetDataSources.size());
        log.info("初始化多租户数据库配置完成...");
    }
}
